package com.medical.blood.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.medical.blood.entity.PaymentOrder;
import com.medical.blood.mapper.PaymentOrderMapper;
import com.medical.blood.service.DeviceStatusService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.math.BigDecimal;
import java.util.Date;
import java.util.UUID;

@Service
public class PaymentOrderService extends ServiceImpl<PaymentOrderMapper, PaymentOrder> {

    @Autowired
    private DeviceStatusService deviceStatusService; // 设备服务（用于联动采血）

    /**
     * 生成订单（用户选择检测项目后调用）
     * @param userId 用户ID
     * @param deviceId 设备ID
     * @param testItemIds 检测项目ID集合
     * @param totalAmount 总费用
     * @return 订单信息（含订单编号）
     */
    public PaymentOrder createOrder(Long userId, String deviceId, String testItemIds, BigDecimal totalAmount) {
        PaymentOrder order = new PaymentOrder();
        order.setOrderNo(generateOrderNo()); // 生成唯一订单号
        order.setUserId(userId);
        order.setDeviceId(deviceId);
        order.setTestItemIds(testItemIds);
        order.setTotalAmount(totalAmount);
        order.setPayStatus("未支付"); // 初始状态
        save(order);
        return order;
    }

    /**
     * 生成唯一订单号（UUID简化）
     */
    private String generateOrderNo() {
        return "ORDER_" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
    }

    /**
     * 更新支付状态（支付回调后调用）
     * @param orderNo 订单编号
     * @param transactionId 微信支付交易号
     * @return 更新结果
     */
    public boolean updatePayStatus(String orderNo, String transactionId) {
        PaymentOrder order = lambdaQuery()
                .eq(PaymentOrder::getOrderNo, orderNo)
                .one();
        if (order == null) {
            throw new RuntimeException("订单不存在");
        }
        // 仅允许“未支付”状态更新为“已支付”
        if (!"未支付".equals(order.getPayStatus())) {
            throw new RuntimeException("订单状态异常，无法重复支付");
        }
        order.setPayStatus("已支付");
        order.setPayTime(new Date());
        order.setWxPayTransactionId(transactionId);
        boolean success = updateById(order);
        // 支付成功后联动设备：允许启动采血流程（示例：调用设备服务标记状态）
        if (success) {
            deviceStatusService.markReadyForCollection(order.getDeviceId(), order.getUserId());
        }
        return success;
    }

    /**
     * 查询订单状态（供小程序查询）
     * @param orderNo 订单编号
     * @param userId 用户ID
     * @return 订单状态
     */
    public String getOrderStatus(String orderNo, Long userId) {
        PaymentOrder order = lambdaQuery()
                .eq(PaymentOrder::getOrderNo, orderNo)
                .eq(PaymentOrder::getUserId, userId)
                .one();
        return order == null ? "订单不存在" : order.getPayStatus();
    }
}